home *** CD-ROM | disk | FTP | other *** search
- /**
- * Scout - The Amiga System Monitor
- *
- *------------------------------------------------------------------
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * You must not use this source code to gain profit of any kind!
- *
- *------------------------------------------------------------------
- *
- * @author Andreas Gelhausen
- * @author Richard Körber <rkoerber@gmx.de>
- */
-
-
-
- #include "system_headers.h"
-
- int taskcnt;
- APTR taskmoretext0,taskmoretext1a,taskmoretext1b,taskmoretext2,taskmoretext3;
- APTR procmorelist;
- APTR processmoretext0,processmoretext1a,processmoretext1b,processmoretext2,processmoretext3;
- APTR processmoretext4,processmoretext5,processmoretext6a,processmoretext6b,processmoretext7;
-
- static APTR TaskPool = NULL;
-
- BOOL timer_ticking = FALSE;
-
- struct SignalSemaphore *patchsem = NULL;
- static UBYTE __aligned SemaphoreName[] = "« Scout's CPU patch »";
-
- VOID __asm (*cleartaskdata) (VOID) = NULL;
- LONG __asm (*gettaskdata) (register __d0 struct Task *) = NULL;
- struct Task * __asm (*getaddedtask) (VOID) = NULL;
- char *switchstate = NULL;
-
- LONG totalmicros,cpuseconds = 1,cpumicros = 0;
-
- #define CHEATSTACKSIZE 1024
- #define CHEATTASKNAME "« Scout's cheat task »"
- struct Task *cheattask = NULL;
-
- static void cheattask_func (void) {
- while (TRUE) {}
- }
-
- struct Task * AddCheatTask (void) {
- struct Task *result;
-
- if (result = AllocVec(CHEATSTACKSIZE + sizeof (struct Task), MEMF_ANY|MEMF_CLEAR)) {
- result->tc_SPLower = sizeof (struct Task) + (char *) result;
- result->tc_SPUpper = CHEATSTACKSIZE + sizeof (struct Task) + (char *) result;
- result->tc_SPReg = result->tc_SPUpper;
-
- result->tc_Node.ln_Name = CHEATTASKNAME;
- result->tc_Node.ln_Pri = -128;
- result->tc_Node.ln_Type = NT_TASK;
-
- AddTask(result, (APTR) &cheattask_func, NULL);
- }
- return (result);
- }
-
- void RemoveCheatTask (void) {
- RemTask(cheattask);
- FreeVec(cheattask);
- cheattask = NULL;
- }
-
- struct Task * TaskExists (struct Task *tasktofind) {
- struct Task *task, *result = NULL;
-
- if ((tasktofind == (struct Task *) 42) || (tasktofind == myprocess))
- return (myprocess);
-
- Forbid();
-
- task = FIRSTTASKREADY;
- while (task->tc_Node.ln_Succ != 0) {
- if (task == tasktofind)
- result = task;
- task = (struct Task *) task->tc_Node.ln_Succ;
- }
-
- task = FIRSTTASKWAIT;
- while (task->tc_Node.ln_Succ != 0) {
- if (task == tasktofind)
- result = task;
- task = (struct Task *) task->tc_Node.ln_Succ;
- }
-
- Permit();
- return (result);
- }
-
- void HandleTimerRequest (BOOL waitstate) {
- struct Window *taskwin;
-
- if (!waitstate && timer_ticking) {
- AbortIO((struct IORequest *) TimerIORequest);
- WaitIO((struct IORequest *) TimerIORequest);
- timer_ticking = FALSE;
- }
-
- if ((patchsem) && (*switchstate)) {
-
- // if (((waitstate) && (TimerIORequest->tr_node.io_Message.mn_Node.ln_Type != NT_MESSAGE)) || (! waitstate)) {
- if ((waitstate && timer_ticking) || !waitstate) {
-
- (*cleartaskdata) ();
-
- if (WI_Tasks) {
- TimerIORequest->tr_time.tv_secs = cpuseconds;
- TimerIORequest->tr_time.tv_micro = cpumicros;
- TimerIORequest->tr_node.io_Command = TR_ADDREQUEST;
- SendIO ((struct IORequest *) TimerIORequest);
- timer_ticking = TRUE;
-
- get (WI_Tasks, MUIA_Window_Window, &taskwin);
- if (taskwin) UpdateTasks();
- }
- }
- }
- }
-
- void CheckCPUUsage (void)
- {
- ULONG semsize, size;
-
- get (CY_CpuUsage,MUIA_Cycle_Active,&updatetimestate);
-
- if (updatetimestate) {
- semsize = (sizeof(struct SignalSemaphore) + strlen(SemaphoreName) + 7) & ~7;
-
- Forbid();
- if (patchsem = FindSemaphore ((UBYTE *) &SemaphoreName)) {
- CodeAddress = semsize + 8 + (char *) patchsem;
- Permit();
- } else {
- AsmTimerBase = (struct Library *) FindName (&SysBase->DeviceList, TIMERNAME);
- Permit();
-
- if (AsmTimerBase) {
- size = (ULONG) ((char *) &CodeAddress - (char *) &MySwitch + 8);
- if (patchsem = AllocVec(semsize + 8 + size, MEMF_ANY|MEMF_CLEAR)) {
- Forbid();
- FreeVec(patchsem);
- patchsem = AllocVec(semsize + 8 + size, MEMF_ANY|MEMF_CLEAR|MEMF_REVERSE);
- Permit();
-
- if (patchsem) {
- strcpy((char *)patchsem + sizeof(struct SignalSemaphore), SemaphoreName);
-
- CodeAddress = semsize + 8 + (char *) patchsem;
- OldSwitch = *((ULONG *) (-52 + (char *) SysBase));
- OldAdd = *((ULONG *) (-280 + (char *) SysBase));
-
- CopyMem(&MySwitch, (APTR) CodeAddress, size);
-
- InitSemaphore(patchsem);
- patchsem->ss_Link.ln_Name = (char *)patchsem + sizeof(struct SignalSemaphore); // (char *) &SemaphoreName - (char *) &MySwitch + CodeAddress;
- AddSemaphore(patchsem);
-
- // cleartaskdata = (VOID (* __asm) (VOID)) ((char *) &ClearTaskData - (char *) &MySwitch + CodeAddress);
- // gettaskdata = (LONG (* __asm)(register __d0 struct Task *)) ((char *) &GetTaskData - (char *) &MySwitch + CodeAddress);
- // getaddedtask = (struct Task *(* __asm)(VOID)) ((char *) &GetAddedTask - (char *) &MySwitch + CodeAddress);
-
- SetPatches();
- ShowTasks();
- }
- }
- } else {
- aprintf ("Couldn't find %s!\n", TIMERNAME);
- }
- }
- }
-
- if (patchsem) {
- cleartaskdata = (VOID (* __asm) (VOID)) ((char *) &ClearTaskData - (char *) &MySwitch + CodeAddress);
- gettaskdata = (LONG (* __asm)(register __d0 struct Task *)) ((char *) &GetTaskData - (char *) &MySwitch + CodeAddress);
- getaddedtask = (struct Task *(* __asm)(VOID)) ((char *) &GetAddedTask - (char *) &MySwitch + CodeAddress);
- switchstate = (char *) &SwitchState - (char *) &MySwitch + CodeAddress;
-
- *switchstate = (char) updatetimestate;
- HandleTimerRequest (FALSE);
-
- if (updatetimestate == 2) {
- if (!cheattask) cheattask = AddCheatTask();
- } else {
- if (cheattask) RemoveCheatTask();
- set(cpucount,MUIA_Gauge_Current,0);
- set(cpucount,MUIA_Gauge_InfoText,"\0330-----");
- }
- }
- }
-
- char * GetTaskState (UBYTE state) {
- char *TaskStateText[] = {
- "frozen","added","run","ready","wait","except","removed",
- "invalid","< ??? >"
- };
-
- UBYTE TaskState[] = {
- TS_FROZEN,TS_ADDED,TS_RUN,TS_READY,TS_WAIT,TS_EXCEPT,TS_REMOVED,
- TS_INVALID
- };
-
- int i = 0;
-
- while (TaskState[i]) {
- if (state == TaskState[i]) {
- return (TaskStateText[i]);
- }
- i++;
- }
- if (TaskState[i] == TS_INVALID) {
- return (TaskStateText[i]);
- } else {
- return (TaskStateText[i+1]);
- }
- }
-
- char * GetNodeType (UBYTE type) {
- char *NodeTypeText[] = {
- "task","interrupt","device","msgport",
- "message","freemsg","replymsg","resource","library",
- "memory","softint","font","process","semaphore",
- "signalsem","bootnode","kickmem","graphics",
- "deathmessage","user","extended",
- "unknown","< ??? >"
- };
-
- UBYTE NodeType[] = {
- NT_TASK,NT_INTERRUPT,NT_DEVICE,NT_MSGPORT,
- NT_MESSAGE,NT_FREEMSG,NT_REPLYMSG,NT_RESOURCE,
- NT_LIBRARY,NT_MEMORY,NT_SOFTINT,NT_FONT,NT_PROCESS,
- NT_SEMAPHORE,NT_SIGNALSEM,NT_BOOTNODE,NT_KICKMEM,
- NT_GRAPHICS,NT_DEATHMESSAGE,NT_USER,NT_EXTENDED,
- NT_UNKNOWN
- };
-
- int i = 0;
-
- while (NodeType[i]) {
- if (type == NodeType[i]) {
- return (NodeTypeText[i]);
- }
- i++;
- }
- if (NodeType[i] == NT_UNKNOWN)
- return (NodeTypeText[i]);
- else
- return (NodeTypeText[i+1]);
- }
-
- __asm __saveds LONG tasklist_cmpcpufunc (register __a1 struct TaskEntry *te1, register __a2 struct TaskEntry *te2)
- {
- LONG result;
-
- result = strcmpi(te2->ts_cpu, te1->ts_cpu);
- if (result == 0) result = strcmpi(te1->ts_name, te2->ts_name);
-
- return result;
- }
-
- struct Hook tasklist_cmpcpuhook = {
- {NULL, NULL},
- (ULONG (* )())tasklist_cmpcpufunc,
- NULL, NULL
- };
-
- __asm __saveds LONG tasklist_cmpprifunc (register __a1 struct TaskEntry *te1, register __a2 struct TaskEntry *te2)
- {
- long eins = 0, zwei = 0;
-
- IsDec (te1->ts_pri, &eins);
- IsDec (te2->ts_pri, &zwei);
- return zwei - eins;
- }
-
- struct Hook tasklist_cmpprihook = {
- {NULL, NULL},
- (ULONG (* )())tasklist_cmpprifunc,
- NULL, NULL
- };
-
- __asm __saveds LONG tasklist_cmpaddressfunc (register __a1 struct ListEntry *le1, register __a2 struct ListEntry *le2)
- {
- return (LONG)le1->le_adr - (LONG)le2->le_adr;
- }
-
- struct Hook tasklist_cmpaddresshook = {
- {NULL, NULL},
- (ULONG (* )())tasklist_cmpaddressfunc,
- NULL, NULL
- };
-
- __asm __saveds LONG tasklist_dspfunc(register __a2 char **array, register __a1 struct TaskEntry *taskentry, register __a0 struct Hook *hook)
- {
- if (taskentry) {
- *array++ = taskentry->ts_address;
- *array++ = taskentry->ts_type;
- *array++ = taskentry->ts_pri;
- *array++ = taskentry->ts_num;
- *array++ = taskentry->ts_state;
- *array++ = taskentry->ts_sigwait;
- *array++ = taskentry->ts_cpu;
- *array++ = taskentry->ts_name;
- *array = NULL;
- } else {
- *array++ = ESC "bAddress";
- *array++ = ESC "bln_Type";
- *array++ = ESC "bln_Pri";
- *array++ = ESC "bNUM";
- *array++ = ESC "bState";
- *array++ = ESC "bSigWait";
- *array++ = ESC "bCPU %";
- *array++ = ESC "bln_Name";
- *array = NULL;
- }
- return (0);
- }
-
- struct Hook tasklist_dsphook = {
- {NULL, NULL},
- (ULONG (* )())tasklist_dspfunc,
- NULL, NULL
- };
-
- void FreeTasks (void)
- {
- MyFreePoolStructs(&TaskPool, tasktext, NULL, tasklist);
- }
-
- char * GetTaskName (struct Task *task) {
- struct CommandLineInterface *cli;
- int lauf = 0;
- // int offset = 0;
- char *pointer;
- char *error = "<notask>";
-
- if (task) {
- if ((task->tc_Node.ln_Type == NT_PROCESS) && (((struct Process *) task)->pr_CLI != 0)) {
- cli = (struct CommandLineInterface *) (((struct Process *) task)->pr_CLI << 2);
- if ((pointer = (char *) cli->cli_CommandName) &&
- (pointer = (char *) (((LONG) pointer) << 2) + 1) &&
- (pointer[0])) {
-
- while (pointer[lauf]) {
- if (pointer[lauf++] != ' ')
- return (pointer);
- }
- /*
- pointer = (char *) (((LONG) pointer) << 2);
-
- while (*(pointer + lauf) != '\0') {
- if ((*(pointer + lauf) == '/') || ((*(pointer + lauf) == ':') && (*(pointer + lauf + 1) != '\0'))) {
- offset = lauf;
- }
- lauf++;
- }
- if (lauf)
- return (pointer + 1 + offset);
- */
- }
- }
- if (((task->tc_Node.ln_Type == NT_PROCESS) || (task->tc_Node.ln_Type == NT_TASK)) \
- && (task->tc_Node.ln_Succ)) {
- return (task->tc_Node.ln_Name);
- } else {
- return (error);
- }
- }
- return (NULL);
- }
-
- void GetTaskNumber (struct Task *task, char string[]) {
- if ((task->tc_Node.ln_Type == NT_TASK) || (((struct Process *)task)->pr_TaskNum == 0)){
- strcpy (string, "---");
- } else {
- _sprintf (string, "%ld", ((struct Process *) task)->pr_TaskNum);
- }
- }
-
- void GetTaskEntry (struct Task *task, struct TaskEntry *taskentry, BOOL cpuflag) {
- char tasknum[4];
- ULONG cpu,zehntel;
-
- if (! taskentry->ts_ptr) {
- taskentry->ts_ptr = task;
-
- _sprintf (taskentry->ts_address, "$%08lx", task);
- strcpy (taskentry->ts_type, GetNodeType (task->tc_Node.ln_Type));
- GetTaskNumber (task, tasknum);
- strncpy (taskentry->ts_num, tasknum, 3);
- }
-
- _sprintf (taskentry->ts_pri, "%4ld ", task->tc_Node.ln_Pri);
- strcpy (taskentry->ts_state, GetTaskState ((UBYTE) task->tc_State));
- _sprintf (taskentry->ts_sigwait, "$%08lx", task->tc_SigWait);
- strncpy (taskentry->ts_name, nonetest (GetTaskName (task)), NODENAMELENGTH);
- healstring (taskentry->ts_name);
-
- if ((cpuflag) && (totalmicros = *((ULONG *) ((char *) &TotalMicros1 + 4 - (char *) &MySwitch + CodeAddress)))) {
- cpu = (*gettaskdata)(task);
-
- if (!(zehntel = UDivMod32 (totalmicros, 1000)))
- zehntel = 1;
-
- zehntel = UDivMod32 (cpu, zehntel);
- cpu = UDivMod32 (zehntel, 10);
- zehntel -= UMult32 (cpu, 10);
- if (cpu > 99) {
- cpu = 100;
- zehntel = 0;
- }
- _sprintf (taskentry->ts_cpu, "%3ld.%ld ", cpu, zehntel);
- } else {
- strcpy (taskentry->ts_cpu, " 0.0 ");
- }
- }
-
- void UpdateTasks (void) {
- struct TaskEntry *taskentry,*cmptaskentry;
- struct Task *task;
- int i;
- ULONG cheatcpu;
- BOOL changed;
-
- while (task = (*getaddedtask) ()) {
- if (TaskExists (task) && (taskentry = tbAllocPooled(TaskPool, sizeof(struct TaskEntry)))) {
- GetTaskEntry (task, taskentry, TRUE);
- InsertSortedEntry (tasklist, (APTR *) &taskentry);
- SetCountText (taskcount, ++taskcnt);
- }
- }
-
- if (cmptaskentry = AllocVec(sizeof(struct TaskEntry), MEMF_ANY|MEMF_CLEAR)) {
- changed = FALSE;
- for (i=0;;i++) {
- DoMethod (tasklist,MUIM_List_GetEntry,i,&taskentry);
-
- if (taskentry) {
- if (task = TaskExists ((struct Task *) taskentry->ts_ptr)) {
- CopyMem (taskentry, cmptaskentry, sizeof (struct TaskEntry));
- GetTaskEntry (task, taskentry, TRUE);
- if (memcmp (taskentry,cmptaskentry, sizeof (struct TaskEntry))) {
- if (tasklist_cmphook_ptr != TaskSortList[3]) DoMethod (tasklist,MUIM_List_Redraw,i);
- changed = TRUE;
- }
- } else {
- if (! (task = TaskExists ((struct Task *) taskentry->ts_ptr))) {
- DoMethod (tasklist, MUIM_List_Remove, i--);
- SetCountText (taskcount, --taskcnt);
- }
- }
- } else {
- break;
- }
- }
- if (changed && tasklist_cmphook_ptr == TaskSortList[3]) DoMethod(tasklist, MUIM_List_Sort);
- FreeVec(cmptaskentry);
- }
-
- if (updatetimestate == 2) {
- cheatcpu = (*gettaskdata)(cheattask);
- if (totalmicros) {
- set(cpucount,MUIA_Gauge_InfoText,"%ld%%");
- set(cpucount,MUIA_Gauge_Current,UDivMod32 (UMult32 (totalmicros - cheatcpu, 100), totalmicros));
- //* MySetContents (cpucount, ESC "r%ld \%", UDivMod32 (UMult32 (totalmicros - cheatcpu, 100), totalmicros));
- }
- }
- }
-
- int GetTasks (struct TaskEntry **first) {
- #define maxtasknumber 512
-
- struct Task *task;
- struct TaskEntry *taskentry,*previous = NULL;
- unsigned long *buffer,maxcnt,loopcnt;
-
- int taskcnt = 0;
- *first = 0;
-
- if (!TaskPool) TaskPool = tbCreatePool(MEMF_CLEAR, 4096, 4096);
-
- if (clientstate) {
- if (SendDaemon ("GetTaskList")) {
- while ((taskentry = tbAllocPooled(TaskPool, sizeof(struct TaskEntry))) \
- && (ReceiveDecodedEntry ((UBYTE *) taskentry, sizeof (struct TaskEntry)))) {
- IsHex (taskentry->ts_address, (long *) &taskentry->ts_ptr);
-
- if (! *first)
- *first = taskentry;
- if (previous)
- previous->ts_next = taskentry;
-
- taskcnt++;
- previous = taskentry;
- }
- }
- } else {
- loopcnt = 0;
- maxcnt = maxtasknumber;
-
- if (buffer = AllocVec((maxtasknumber+1) * sizeof(unsigned long), MEMF_ANY|MEMF_CLEAR)) {
- Forbid();
-
- task = FIRSTTASKREADY;
- while ((task->tc_Node.ln_Succ != 0) && (maxcnt)) {
- buffer[taskcnt++] = (ULONG) task;
- maxcnt--;
- task = (struct Task *)task->tc_Node.ln_Succ;
- }
-
- task = FIRSTTASKWAIT;
- while ((task->tc_Node.ln_Succ != 0) && (maxcnt)) {
- buffer[taskcnt++] = (ULONG) task;
- maxcnt--;
- task = (struct Task *)task->tc_Node.ln_Succ;
- }
-
- Permit();
-
- while ((buffer[loopcnt]) && (taskentry = tbAllocPooled(TaskPool, sizeof(struct TaskEntry)))) {
- if (! *first)
- *first = taskentry;
- if (previous)
- previous->ts_next = taskentry;
-
- GetTaskEntry ((struct Task *) buffer[loopcnt++], taskentry, FALSE);
- previous = taskentry;
- }
- FreeVec(buffer);
-
- if (taskentry = tbAllocPooled(TaskPool, sizeof(struct TaskEntry))) {
- if (previous)
- previous->ts_next = taskentry;
-
- GetTaskEntry (myprocess, taskentry, FALSE);
- taskentry->ts_ptr = (struct Task *) 42; // 42, damit Scouts Prozess oben in der Liste steht!
- taskcnt++;
- // previous = taskentry;
- }
- }
- }
- return (taskcnt);
- }
-
- void PrintTasks (char *filename) {
- int i=1;
- BPTR handle;
- struct TaskEntry *entryp = NULL;
-
- handle = HandlePrintStart (filename);
- if ((handle) && (PrintOneLine (handle, "\n Address Type Pri NUM State SigWait Name\n\n"))) {
- if (! WI_Tasks) {
- i = GetTasks (&entryp);
- }
- if (i) {
- for (i=0;;i++) {
- if (WI_Tasks)
- DoMethod (tasklist,MUIM_List_GetEntry,i,&entryp);
- if (!entryp) break;
-
- _sprintf (tmpstr2, " %s %-7.7s %4s%3s %-7.7s %s %s\n", entryp->ts_address, entryp->ts_type, entryp->ts_pri, entryp->ts_num, entryp->ts_state, entryp->ts_sigwait, entryp->ts_name);
- if (! (PrintOneLine (handle, tmpstr2)))
- break;
-
- if (! WI_Tasks)
- entryp = entryp->ts_next;
- }
- }
- }
- HandlePrintStop();
- }
-
- void ShowTasks (void) {
- #define maxtasknumber 512
-
- struct TaskEntry *task;
-
- ApplicationSleep();
- set(tasklist,MUIA_List_Quiet,TRUE);
- set(tasklist,MUIA_List_CompareHook,tasklist_cmphook_ptr);
- set(BT_TaskRemove, MUIA_Disabled, TRUE);
- set(BT_TaskFreeze, MUIA_Disabled, TRUE);
- set(BT_TaskActivate, MUIA_Disabled, TRUE);
- set(BT_TaskPriority, MUIA_Disabled, TRUE);
- set(BT_TaskSignal, MUIA_Disabled, TRUE);
- set(BT_TaskBreak, MUIA_Disabled, TRUE);
- set(BT_TaskMore, MUIA_Disabled, TRUE);
-
- if (clientstate) {
- set(CY_CpuUsage, MUIA_Disabled, TRUE);
- }
- FreeTasks();
-
- taskcnt = GetTasks (&task);
-
- while (task) {
- InsertSortedEntry (tasklist, (APTR *) &task);
- task = task->ts_next;
- }
-
- SetCountText (taskcount, taskcnt);
- AwakeApplication();
- set(tasklist,MUIA_List_Quiet,FALSE);
- }
-
- void SendTaskList (void) {
- struct TaskEntry *task;
-
- FreeTasks();
- GetTasks (&task);
-
- while (task) {
- SendEncodedEntry ((UBYTE *) task, sizeof (struct TaskEntry));
- task = task->ts_next;
- }
- FreeTasks();
- }
-
- void GetTaskMore (struct Task *task) {
- unsigned char *title = "TASK: ";
- struct WinFree *ptr;
-
- if (ptr = AllocWinFree()) {
- ptr->wf_Window = (APTR) WindowObject,
-
- // MUIA_Window_SizeGadget, FALSE,
- MUIA_HelpNode, TasksText,
- MUIA_Window_ID, MakeDetailID('.','T','A','S'),
- WindowContents, HGroup,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, MyLabel2 ("Name:"),
- Child, MyLabel2 ("Address:\nIDNestCnt:\nTrapAlloc:\nTrapAble:\nTrapData:\nTrapCode:\nUserData:"),
- Child, MyLabel2 ("Flags:"),
- End,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, taskmoretext0 = MyTextObject(),
- Child, HGroup,
- Child, VGroup,
- Child, taskmoretext1a = MyTextObject2(),
- Child, taskmoretext1b = KeyButtonF ('b', task->tc_Flags),
- End,
- Child, MyLabel ("State:\nTDNestCnt:\nExceptData:\nExceptCode:\nStackSize:\nSPLower:\nSPUpper:\nSPReg:"),
- Child, taskmoretext2 = MyTextObject2(),
- Child, MyLabel ("Pri:\nSigAlloc:\nSigWait:\nSigRecvd:\nSigExcept:\nSwitch():\nLaunch():\nMemEntry:"),
- Child, taskmoretext3 = MyTextObject2(),
- End,
- End,
- End, End;
-
- if (ptr->wf_Window) {
- MySetContents (taskmoretext1a, ESC "r $%08lx\n%ld\n$%04lx\n$%04lx\n $%08lx\n $%08lx\n $%08lx", task, task->tc_IDNestCnt, task->tc_TrapAlloc, task->tc_TrapAble, task->tc_TrapData, task->tc_TrapCode, task->tc_UserData);
- MySetContents (taskmoretext2, ESC "c%s\n" ESC "r%ld\n$%08lx\n$%08lx\n%ld\n$%08lx\n$%08lx\n$%08lx", GetTaskState ((BYTE) task->tc_State), task->tc_TDNestCnt, task->tc_ExceptData, task->tc_ExceptCode, (char *) task->tc_SPUpper - (char *) task->tc_SPLower, task->tc_SPLower, task->tc_SPUpper, task->tc_SPReg);
- MySetContents (taskmoretext3, ESC "r%ld\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx", task->tc_Node.ln_Pri, task->tc_SigAlloc, task->tc_SigWait, task->tc_SigRecvd, task->tc_SigExcept, task->tc_Switch, task->tc_Launch, task->tc_MemEntry);
-
- HandleFlagsButtonPressed (taskmoretext1b, ptr, "(TASK)", "tc_Flags", task->tc_Flags, (struct LongFlag *) &tc_flags, NULL, 'b');
- HandleWindowOpen (ptr, title, GetTaskName (task));
- MySetContents (taskmoretext0, "%s", GetTaskName (task));
- HandleWindowClose (ptr);
- }
- }
- }
-
- __asm __saveds LONG procmore_dspfunc(register __a2 char **array, register __a1 struct HunkEntry *hunkentry, register __a0 struct Hook *hook)
- {
- if (hunkentry) {
- *array++ = hunkentry->he_lower;
- *array++ = hunkentry->he_upper;
- *array++ = hunkentry->he_size;
- *array = NULL;
- } else {
- *array++ = ESC "bLower";
- *array++ = ESC "bUpper";
- *array++ = ESC "bSize";
- *array = NULL;
- }
- return (0);
- }
-
- struct Hook procmore_dsphook = {
- {NULL, NULL},
- (ULONG (* )())procmore_dspfunc,
- NULL, NULL
- };
-
- void GetSegList (struct Process *proc) {
- struct HunkEntry *hunkentry;
- long *seg;
- long size;
-
- set(procmorelist,MUIA_List_Quiet,TRUE);
-
- if (((seg = (long *) (((long) *((long *) (((long) proc->pr_SegList<<2) + 12)))<<2)) && points2ram((APTR) seg)) || \
- ((proc->pr_CLI) && (seg = (long *) (((struct CommandLineInterface *) (proc->pr_CLI<<2))->cli_Module<<2)))) {
-
- while ((seg) && (hunkentry = tbAllocPooled(TaskPool, sizeof(struct HunkEntry)))) {
- _sprintf (hunkentry->he_lower, "$%08lx", ((char *) seg) + 4);
- size = *(seg - 1);
- _sprintf (hunkentry->he_size, "%ld", size);
- _sprintf (hunkentry->he_upper, "$%08lx", ((char *) seg) - 4 + size);
-
- InsertBottomEntry (procmorelist, (APTR *) &hunkentry);
- seg = (long *) ((*seg)<<2);
- }
- }
-
- set(procmorelist,MUIA_List_Quiet,FALSE);
- }
-
- void GetProcessMore (struct Process *proc) {
- unsigned char *title = "PROCESS: ";
- unsigned char tasknum[4];
- struct WinFree *ptr;
-
- if (ptr = AllocWinFree()) {
- ptr->wf_Window = (APTR) WindowObject,
-
- // MUIA_Window_SizeGadget, FALSE,
- MUIA_HelpNode, TasksText,
- MUIA_Window_ID, MakeDetailID('.','T','A','S'),
- WindowContents, HGroup,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- #ifndef WINDOW_PROBLEMS
- Child, MyLabel2 ("Name:"),
- #endif
- Child, MyLabel2 ("Address:\nIDNestCnt:\nTrapAlloc:\nTrapAble:\nTrapData:\nTrapCode:\nUserData:"),
- Child, MyLabel2 ("Flags:"),
- Child, MyLabel2 ("Pad:\nGlobVec:\nResult2:\nCOS:\nCLI:\nWindowPtr:"),
- Child, MyLabel2 ("\nHunks:\n\n\n\n"),
- Child, MyVSpace(0),
- End,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- #ifndef WINDOW_PROBLEMS
- Child, processmoretext0 = MyTextObject(),
- #endif
- Child, HGroup,
- Child, VGroup,
- Child, HGroup,
- Child, VGroup, MUIA_Group_SameWidth, TRUE, MUIA_Weight, 0,
- Child, processmoretext1a = MyTextObject(),
- Child, processmoretext1b = KeyButtonF ('b', ((struct Task *) proc)->tc_Flags),
- Child, processmoretext4 = MyTextObject(),
- End,
- // Child, MyHSpace(0),
- Child, VGroup, MUIA_Group_SameWidth, TRUE, MUIA_Weight, 60,
- Child, MyLabel ("State:\nTDNestCnt:\nExceptData:\nExceptCode:\nStackSize:\nSPLower:\nSPUpper:\nSPReg:"),
- Child, MyVSpace(0),
- Child, MyLabel ("SegList:\nTaskNum:\nCurrentDir:\nConsoleTask:\nReturnAddr:\nHomeDir:"),
- End,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, processmoretext2 = MyTextObject2(),
- Child, MyVSpace(0),
- Child, processmoretext5 = MyTextObject2(),
- End,
- End,
- Child, MyVSpace(2),
- Child, procmorelist = ListviewObject,
- MUIA_Listview_DoubleClick, TRUE,
- MUIA_Listview_Input, FALSE,
- MUIA_Listview_List, ListObject,
- MUIA_List_Format, "COL=0 DELTA=8,COL=1 DELTA=8,COL=2 P=\33r",
- MUIA_List_Title, TRUE,
- MUIA_List_DisplayHook, &procmore_dsphook,
- ReadListFrame,
- End,
- MUIA_CycleChain, TRUE,
- End,
- End,
- // Child, MyHSpace(0),
- Child, VGroup, MUIA_Group_SameWidth, TRUE, MUIA_Weight, 60,
- Child, MyLabel ("Pri:\nSigAlloc:\nSigWait:\nSigRecvd:\nSigExcept:\nSwitch():\nLaunch():\nMemEntry:"),
- Child, MyLabel ("Flags:"),
- Child, MyLabel ("StackSize:\nStackBase:\nCIS:\nFileSystemTask:\nPktWait:"),
- Child, MyLabel ("ExitCode:\nExitData:\nArguments:\nLocalVars:\nShellPrivate:\nCES:"),
- End,
- Child, VGroup, MUIA_Group_SameWidth, TRUE,
- Child, processmoretext3 = MyTextObject2(),
- Child, processmoretext6b = KeyButtonF ('l', proc->pr_Flags),
- Child, processmoretext6a = MyTextObject2(),
- Child, processmoretext7 = MyTextObject2(),
- End,
- End,
- End,
- End, End;
-
- if (ptr->wf_Window) {
- MySetContents (processmoretext1a, ESC "r$%08lx\n%ld\n$%04lx\n$%04lx\n$%08lx\n$%08lx\n$%08lx", proc, proc->pr_Task.tc_IDNestCnt, proc->pr_Task.tc_TrapAlloc, proc->pr_Task.tc_TrapAble, proc->pr_Task.tc_TrapData, proc->pr_Task.tc_TrapCode, proc->pr_Task.tc_UserData);
- MySetContents (processmoretext2, ESC "c%s\n" ESC "r%ld\n$%08lx\n$%08lx\n%ld\n$%08lx\n$%08lx\n$%08lx", GetTaskState ((BYTE) proc->pr_Task.tc_State), proc->pr_Task.tc_TDNestCnt, proc->pr_Task.tc_ExceptData, proc->pr_Task.tc_ExceptCode, (char *) proc->pr_Task.tc_SPUpper - (char *) proc->pr_Task.tc_SPLower, proc->pr_Task.tc_SPLower, proc->pr_Task.tc_SPUpper, proc->pr_Task.tc_SPReg);
- MySetContents (processmoretext3, ESC "r%ld\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx", proc->pr_Task.tc_Node.ln_Pri, proc->pr_Task.tc_SigAlloc, proc->pr_Task.tc_SigWait, proc->pr_Task.tc_SigRecvd, proc->pr_Task.tc_SigExcept, proc->pr_Task.tc_Switch, proc->pr_Task.tc_Launch, proc->pr_Task.tc_MemEntry);
- MySetContents (processmoretext4, ESC "r$%04lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx", proc->pr_Pad, proc->pr_GlobVec, proc->pr_Result2, ((ULONG) proc->pr_COS)<<2, ((ULONG) proc->pr_CLI)<<2, proc->pr_WindowPtr);
-
- GetTaskNumber ((struct Task *) proc, tasknum);
-
- MySetContents (processmoretext5, ESC "r$%08lx\n%s\n$%08lx\n$%08lx\n$%08lx\n$%08lx", ((ULONG) proc->pr_SegList)<<2, tasknum, ((ULONG) proc->pr_CurrentDir)<<2, proc->pr_ConsoleTask, proc->pr_ReturnAddr, ((ULONG) proc->pr_HomeDir)<<2);
- MySetContents (processmoretext6a, ESC "r%ld\n$%08lx\n$%08lx\n$%08lx\n$%08lx", proc->pr_StackSize, ((ULONG) proc->pr_StackBase)<<2, ((ULONG) proc->pr_CIS)<<2, proc->pr_FileSystemTask, proc->pr_PktWait);
-
- MySetContents (processmoretext7, ESC "r$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx\n$%08lx", proc->pr_ExitCode, proc->pr_ExitData, proc->pr_Arguments, proc->pr_LocalVars, proc->pr_ShellPrivate, ((ULONG) proc->pr_CES)<<2);
-
- GetSegList (proc);
-
- HandleFlagsButtonPressed (processmoretext1b, ptr, "(PROCESS)", "tc_Flags", ((struct Task *) proc)->tc_Flags, (struct LongFlag *) &tc_flags, NULL, 'b');
- HandleFlagsButtonPressed (processmoretext6b, ptr, "(PROCESS)", "pr_Flags", proc->pr_Flags, (struct LongFlag *) &pr_flags, NULL, 'l');
- HandleWindowOpen (ptr, title, GetTaskName ((struct Task *) proc));
- set (ptr->wf_Window,MUIA_Window_ActiveObject,procmorelist);
- #ifndef WINDOW_PROBLEMS
- MySetContents (processmoretext0, "%s", GetTaskName ((struct Task *) proc));
- #endif
- HandleWindowClose (ptr);
- }
- }
- }
-
-
- APTR TaskSortList[] = {
- &tasklist_cmpaddresshook,
- &list_cmpnamehook,
- &tasklist_cmpprihook,
- &tasklist_cmpcpuhook,
- NULL
- };
-
- static const char *CYA_TaskSortText[] = {
- "address",
- "name",
- "priority",
- "CPU usage",
- NULL
- };
-
- static const char *CYA_CpuUsageText[] = {
- "off",
- "full",
- " in % ",
- NULL
- };
-
- APTR WI_Tasks, tasklist, tasktext, tasktext2, taskcount, CY_TaskSort;
- int tasksortstate = 0;
- APTR BT_TaskPrint, BT_TaskFreeze, BT_TaskActivate, cpucount, CY_CpuUsage;
- APTR BT_TaskUpdate, BT_TaskRemove, BT_TaskSignal, BT_TaskBreak, BT_TaskPriority, BT_TaskMore, BT_TaskExit;
-
- char tasks_title[WINDOWTITLELEN];
-
- void TasksWindow (BOOL state) {
- if (state) {
- if (WI_Tasks) {
- ShowTasks();
- } else {
- WI_Tasks = WindowObject,
- MUIA_Window_Title, MyGetWindowTitle (tasks_title, "TASKS"),
- MUIA_HelpNode, TasksText,
- MUIA_Window_ID, MakeListID('T','A','S','K'),
- WindowContents, VGroup,
- Child, tasklist = MyListviewObject ("COL=0 DELTA=8,COL=1 DELTA=8 P=\33c,COL=2 DELTA=8 P=\33r,COL=3 DELTA=8 P=\33r,COL=4 DELTA=8 P=\33c,COL=5 DELTA=8,COL=6 DELTA=8 P=\33r,COL=7",&tasklist_dsphook),
- Child, MyBelowSortedListview (&tasktext, &taskcount, &CY_TaskSort, CYA_TaskSortText, tasksortstate),
- Child, MyVSpace(2),
- Child, VGroup,
- Child, HGroup, MUIA_Group_SameSize, TRUE,
- Child, BT_TaskPrint = KeyButtonA (PrintText ,ID_TASKPRINT),
- Child, BT_TaskFreeze = KeyButtonA (FreezeText ,ID_TASKFREEZE),
- Child, BT_TaskActivate = KeyButtonA (ActivateText,ID_TASKACTIVATE),
- Child, HGroup,
- Child, MyLabel2 (" CPU:"),
- Child, cpucount = GaugeObject,
- MUIA_Frame , MUIV_Frame_Gauge,
- MUIA_Gauge_Horiz , TRUE,
- MUIA_Gauge_Max , 100,
- MUIA_Gauge_InfoText, "\0330-----",
- MUIA_Gauge_Current , 0,
- End,
- End,
- Child, CY_CpuUsage = CycleObject,
- MUIA_Weight, 0,
- MUIA_Cycle_Entries, CYA_CpuUsageText,
- MUIA_Cycle_Active, updatetimestate,
- End,
- Child, HGroup,
- Child, MyLabel2 (" Secs:"),
- Child, tasktext2 = StringObject,
- MUIA_String_BufferPos, 1,
- MUIA_String_MaxLen, 6, StringFrame,
- MUIA_String_EditHook, &realstring_edithook,
- MUIA_String_Contents, updatetimetext,
- End,
- End,
- End,
- Child, HGroup, MUIA_Group_SameSize, TRUE,
- Child, BT_TaskUpdate = KeyButtonA (UpdateText ,ID_TASKUPDATE),
- Child, BT_TaskRemove = KeyButtonA (RemoveText ,ID_TASKREMOVE),
- Child, BT_TaskSignal = KeyButtonA (SignalText ,ID_TASKSIGNAL),
- Child, BT_TaskBreak = KeyButtonA (BreakText ,ID_TASKBREAK),
- Child, BT_TaskPriority = KeyButtonA (PriorityText,ID_TASKPRIORITY),
- Child, BT_TaskMore = KeyButtonA (MoreText ,ID_TASKMORE),
- Child, BT_TaskExit = KeyButtonA (ExitText ,ID_TASKEXIT),
- End,
- End,
- End, End;
-
- if (WI_Tasks) {
- DoMethod (AP_Scout,OM_ADDMEMBER,WI_Tasks);
- DoMethod (WI_Tasks,MUIM_Window_SetCycleChain,tasklist,CY_TaskSort,BT_TaskPrint,BT_TaskFreeze,BT_TaskActivate,CY_CpuUsage,tasktext2,BT_TaskUpdate,BT_TaskRemove,BT_TaskSignal,BT_TaskBreak,BT_TaskPriority,BT_TaskMore,BT_TaskExit,NULL);
- DoMethod (CY_CpuUsage, MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime, AP_Scout, 2, MUIM_Application_ReturnID, ID_CPUUSAGE);
- DoMethod (CY_TaskSort, MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime, AP_Scout, 2, MUIM_Application_ReturnID, ID_TASKSORT);
- DoMethod (tasktext2,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,tasktext2,3,MUIM_CallHook,&cpuinterval_callhook,MUIV_TriggerValue);
-
- SetCloseRequest (WI_Tasks,ID_TASKEXIT);
- SetListActive (tasklist,ID_TASKLV_ACTIVE);
- SetListviewDoubleClick (tasklist,ID_TASKMORE);
-
- ShowTasks();
-
- SetWindowOpen (WI_Tasks,tasklist,ID_TASKEXIT);
-
- timer_ticking = FALSE;
-
- if (updatetimestate) CheckCPUUsage();
- }
- }
- } else if ((! state) && (WI_Tasks)) {
- if (patchsem) *switchstate = FALSE;
-
- if (cheattask) RemoveCheatTask();
-
- SetWindowClose (WI_Tasks,TRUE);
-
- FreeTasks();
-
- if (timer_ticking) {
- AbortIO((struct IORequest *) TimerIORequest);
- WaitIO((struct IORequest *) TimerIORequest);
- timer_ticking = FALSE;
- }
-
- DoMethod (AP_Scout,OM_REMMEMBER,WI_Tasks);
- MUI_DisposeObject (WI_Tasks);
-
- WI_Tasks = NULL;
- tasklist = NULL;
- }
- }
-
-